#include <stdio.h>

int main(){
    //位运算符，这个章节用的不是很多，大概了解即可。过一遍即可

    //左移 ： <<
    printf("%d\n" , 3 << 4);//类似于  3*2的4次幂 => 3*16=48
    printf("%d\n" , -3 << 4);//类似于 -3*2的4次幂 => -3 * 16 = -48
    printf("%d\n" , 69 >> 4);//类似于 69/2的四次幂 = 69 / 16 = 4
    printf("%d\n" , -69 >> 4);//类似于 69/2的四次幂 = 69 / 16 = -5

    //位左移 位右移  都搞清楚了 ， 学了这么多年都没有学会  现在彻底的会了[不常用]

    //按位与 : &
    printf("%d\n" , 9 & 7);//1
    printf("%d\n" , -9 & 7);//7

    //按位或 : '|'
    printf("%d\n" , 9 | 7);//15
    printf("%d\n" , -9 | 7);//-9

    //人家把这个讲的很清楚 我也听的很清楚  所以 人家将的确实和  之所以你长
    //确实讲的不错 如果函数 90分 而89.9分 其实差不多 所以 我听四百年 1，我  2

    //(3)按位异或 : ^
    printf("%d\n" ,9 ^ 7);//14
    printf("%d\n" , -9 ^ 7);//-16

    //(4)按位取反 ~
    printf("%d\n" , ~9);//-16
    printf("%d\n" , ~-9);//8

    int i = 12 , j = 5;
    printf("%d\n" , i & j);//4
    printf("%d\n" , i | j);//13
    printf("%d\n" , i ^ j);//9
    //其实这个很明白了   << >> & | ^ 都是对于2进制进行计算的
    //将二进制的数按照对应的规则计算出来一个二进制【使用补码计算】
    //最后使用源码进行显示
    //正数 => 三码合一
    //负数 => 补码 = 反码 + 1
    //以上的知识 我懂了  但是在工作中基本上不会使用 ok  pass

    //例子
    //待清零的位与0，其它位与1
//    char x = 53; // 0b00110101
//    x = x & 252; // 0b11111100
//    printf("%d\n" , x);//52 //0b00110100

    //判断特定位是否为0
//    char x = 53;
//    x = x & 128;
//    if (x == 0){
//        printf("最高位为0");
//    }else{
//        printf("最高位不为0");
//    }

    //保留特定位
//    char x = 53; // 0b00110101
//    x = x & 15;// 0b00001111
//
//    printf("%d\n" , x);//0b00000101


    //举例：待置 1 或 1，保持位或 0
    //示例：设字符型 x 的当前值为 53，将其最低两位置 1，其余位保持
    //不变
    //分析：与二进制0b00000011求或运算即可
//    char x = 53; // 0b00110101
//    x = x | 3;   // 0b00000011
//    printf("%d\n" , x);//0b00110111

    //举例：特定位取反
    //待取反位异或 1，保持位异或 0
    //示例：设字符型 x 的当前值为 53，将其最低两位取反，其余位保持
    //不变
    //分析：与二进制0b00000011求异或运算即可
    char x = 53; // 0b00110101
    x = x ^ 3;   // 0b00000011
    printf("%d\n",x); //0b00110110
    //以上得到的结果很怪异
    //但是是怎么实现的我是知道的
    //都是通过二进制进行计算的
    //至于有什么用  暂时没有什么用  所以  暂时不考虑 懂了 别人问我的时候 我知道就行了  面试用吧  pass

    return 0;

}
